home *** CD-ROM | disk | FTP | other *** search
- * ------------[ BLED merge (c) Ken Goosens ]-------------
- * Merge this against RBBSSUB2.BAS to produce RSB20530.BAS
- * RBBSSUB2.BAS: Date 3-25-1988 Size 122727 bytes
- * ------------[ Created 05-30-1988 14:38:20 ]------------
- * REPLACING old line(s) by new
- ' $linesize:132
- ' $title: 'RBBSSUB2.BAS CPC16-1A, Copyright 1986 - 88 by D. Thomas Mack'
- ' Copyright 1987 by D. Thomas Mack, all rights reserved.
- ' Name ...............: RBBSSUB2.BAS
- ' Written by .........: D. Thomas Mack
- ' First Released .....: June 29, 1986
- ' Subsequent Releases.: September 28, 1986, March 15, 1987, June 7, 1987
- ' : November 15, 1987, March 27, 1988
- ' Copyright ..........: 1986, 1987, 1988
- ' Purpose.............: The Remote Bulletin Board System for the IBM PC,
- ' RBBS-PC.BAS utilizes a lot of common subroutines.
- ' Those that do not require error trapping are
- ' incorporated within RBBSSUB2.BAS and RBBSSUB3.BAS
- ' as separately callable subroutines in order to free
- ' up as much code as possible within the 64K code
- ' segment used by RBBS-PC.BAS.
- ' Parameters..........: Most parameters are passed via a COMMON statement.
- '
- ' Subroutine Line Function of Subroutine
- ' Name Number
- ' ANSWERIT 201 Answer the telephone when it rings
- ' ASCCODES 129 Allow a CONFIG string to have any ASCII value
- ' BADCHAR 455 Check user name for invalid characters
- ' BADFILE 20741 Check for system crash attempt with bad device name
- ' BADNAME 20235 Check for system crash attempt with bad file name
- ' BAUD450 5507 Allow 300 baud callers to bump up to 450 baud
- ' BRKFNAME 20282 Break a file name into it's component parts
- * ------[ first line different ]------
- ' COPYWRIT 97 *** REMOVED *** 'AL0402
- ' DEFALTU 9600 Write out the user's defaults
- ' DENYACCESS 1386 Downgrade security so access denied
- ' DOOREXIT 10987 Set up a .BAT file to exit RBBS-PC and go to a "door"
- ' DOSEXIT 10934 Set up a .BAT file to exit to DOS (second level)
- ' GETARC 20141 Handle request for verbose arc listing
- ' GETCOMND 97+ Get RBBS-PC's node id from command line
- ' GETIME 9140 Calculates callers elapsed time (hours, minutes, seconds)
- ' GOIDLE 90 Release resources when waiting for keyboard input
- ' KILLMSG 3955 Delete old or unnecessary messages
- ' LIBRARY 21105 *** REMOVED *** 'AL0402
- ' LINE25 949 Build and/or update line 25 of RBBS-PC's local screen
- ' LINEEDIT 3700 Edit a line while minimizing string space consumption
- ' LOGERROR 13660 Log error message to CALLERS file
- ' LPRNT 1480 Subroutine to write to local display
- ' MLINIT 10 Handle MultiLink initialization/de-initialization
- ' PASSWRD 667 Verify user & message passwords
- ' QTPUT 1477 Fast, but limited, "TPUT" equivalent
- ' RBBSEXIT 10992 Common RBBS-PC exit to transfer control to other programs
- ' RECOVMSG 10410 Recover a deleted message
- ' REMNONALF 5100 Removes non-alpha characters from a string
- ' SENDNAME 20295 *** COMMENTED *** 'AL0402
- ' SETBAUD 1654 Set baud rate in the 8250 chip of the RS232 interface
- ' SETCRLF 1496 Set up the necessary carriage return/line feed string
- ' SETTHREAD 4031 Set up request for threading thru messages
- ' SKIPLINE 1485 Write a # of blank lines to the communications port
- ' SRCHCMND 1240 Searches list of commands in RBBS for a request
- ' SVIOLATION 1380 Process a security violation
- ' SYSMENU 112 Displays sysop menu/status
- ' TESTUSER 20310 *** COMMENTED *** 'AL0402
- ' TGET 1500 Read a line from the communications port
- ' TPUT 1400 Write a line to the communications port
- ' TRIM 99 Strip leading and trailing blanks from a string
- ' TRIMTRAIL 99 Strip off specified string off end of another string
- ' UNTILRIGHT 12880 Ask a question until user says answer is right
- ' UPDATEU 10600 Updates the user record on loging off/exiting RBBS-PC
- ' UPDTUPLOAD 20705 Updates upload directory file
- ' VIEWHELP 1330 Processes help command
- ' WILDCARD 20285 Determines whether string matches a pattern
- ' WORDINFILE 10976 Find a whole word within a file/menu
- ' XFERTYPE 21600 Identify the file transfer protocol
- '
- ' $INCLUDE: 'RBBS-VAR.BAS'
- '
- ' $SUBTITLE: 'MLINIT - MultiLink initialization/deinitialization'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- MLINIT
- '
- ' INPUT PARAMETERS -- MLPARM = 1 INITIALIZE AT STARTUP OR RE-
- ' CYLCE TIME
- ' MLPARM = 2 DE-INITIALIZE ON EXITING TO
- ' A DOOR OR DOS REMOTELY
- ' MLPARM = 3 DE-QUEUE COMMUNICATIONS PORTS
- ' MLPARM = 4 CHECK FOR MULTILINK PRESENT
- ' DOORS.TERMINAL.TYPE
- ' BAUD.TEST
- ' COM.PORT$
- ' COMPUTER.TYPE
- '
- ' OUTPUT PARAMETERS -- NONE
- '
- ' SUBROUTINE PURPOSE -- TO TEST FOR THE PRESENCE OF MULTI-LINK AND SET
- ' MULTI LINK OPTIONS TO BE COMPATIBLE WITH RBBS-PC
- '
- SUB MLINIT (MLPARM) STATIC
- DEF SEG = 0
- IF COMPUTER.TYPE = 1 _
- GOTO 10
- IF NOT MLCOM THEN _
- IF NETWORK.TYPE <> 1 THEN _
- GOTO 10
- MULTI.LINK.PRESENT = PEEK(&H1FE) + 256 * PEEK(&H1FF)
- IF MULTI.LINK.PRESENT = 0 THEN _
- GOTO 10
- ON MLPARM GOSUB 30,20,60,10
- * REPLACING old line(s) by new
- 90 IF MLCOM OR NETWORK.TYPE = 1 THEN _
- CALL MLINIT(5) : _
- EXIT SUB
- CALL GIVEBACK
- END SUB
- ' $SUBTITLE: 'COPYWRIT - subroutine to display RBBS-PC copyright'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- COPYWRIT
- '
- ' INPUT PARAMETERS -- NONE
- '
- ' OUTPUT PARAMETERS -- NONE
- '
- ' SUBROUTINE PURPOSE -- TO DISPLAY RBBS-PC'S COPYRIGHT NOTICE ON THE LOCAL
- ' SYSOP'S SCREEN
- '
- * ------[ first line different ]------
- ' SUB COPYWRIT STATIC
- ' END SUB
- ' $SUBTITLE: 'GETCOMND - subroutine to get command from command line'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- GETCOMND
- '
- ' INPUT PARAMETERS -- PARAMETER MEANING
- ' CONFIG.FILENAME$ NAME OF RBBS-PC ".DEF" FILE TO
- ' USE AS A MODEL WHEN CREATING THE
- ' .DEF FILE NAME TO BE USED BY THIS
- ' COPY OF RBBS-PC.
- '
- ' COMMAND LINE COMMAND LINE USED TO INVOKE
- ' RBBS-PC IN THE FORM:
- '
- ' RBBS-PC.EXE x filename DEBUG /time /baud
- '
- ' WHERE THE OPTIONAL PARAMETERS ARE:
- '
- ' x IS THE NODE ID IN THE RANGE 1-9,0,A-Z
- ' filename IS THE FULLY QUALIFIED FILE NAME TO USE AS THE ".DEF" FILE
- ' DEBUG IS A DEBUGGING SWITCH
- ' /time IS THE TIME OF DAY FOR RBBS-PC TO RETURN TO THE CALLER
- ' /baud IS THE BAUD RATE OF THE CALLER IF RBBS-PC IS BEING SHELLED TO BY
- ' ANOTHER COMMUNICATIONS PROGRAM (THE COMMUNICATIONS PORT BEING
- ' USED IS ASSUMED TO BE THE ONE INPUTTED VIA THE RBBS-PC CONFIG
- ' PROGRAM
- '
- ' IF NO PARAMETERS ARE SUPPLIED, RBBS-PC ASSUMES THAT THE .DEF FILE NAME IS
- ' RBBS-PC.DEF AND THAT THE NODE IS NODE 1.
- '
- ' OUTPUT PARAMETERS -- CONFIG.FILENAME$ NAME OF RBBS-PC ".DEF" FILE FOR
- ' THIS COPY OF RBBS-PC TO USE
- ' NODE.RECORD.INDEX RECORD NUMBER WITHIN THE
- ' MESSAGES FILE FOR THIS "NODE"
- ' (RANGE IS 2 TO 36)
- '
- ' SUBROUTINE PURPOSE -- TO GET NODE ID FROM COMMAND LINE
- '
- SUB GETCOMND (PASSED.DEBUG,NETIME$) STATIC 'TRAIL
- STATIC DEBUG
- '
- ' *****************************************************************************
- ' * GET NODE ID FROM COMMAND LINE *
- ' *****************************************************************************
- '
- PM$ = COMMAND$
- CALL ALLCAPS(PM$)
- NETBAUD$ = "" 'TRAIL
- IF INSTR(PM$,"/") = 0 THEN _
- GOTO 98
- '
- ' *****************************************************************************
- ' * PARSE THE COMMAND LINE FOR TWO POSITIONAL SWITCHES FOR NET MAIL *
- ' *****************************************************************************
- '
- CMD.LINE$ = MID$(PM$,INSTR(PM$,"/") + 1,LEN(PM$) - INSTR(PM$,"/"))
- PM$ = LEFT$(PM$,INSTR(PM$,"/") - 1)
- IF INSTR(CMD.LINE$,"/") = 0 THEN _
- NETIME$ = CMD.LINE$ 'TRAIL
- IF INSTR(CMD.LINE$,"/") > 0 THEN _ 'TRAIL
- NETIME$ = LEFT$(CMD.LINE$,INSTR(CMD.LINE$,"/") - 1) : _
- NETBAUD$ = MID$(CMD.LINE$,INSTR(CMD.LINE$,"/") + 1)
- CALL TRIM(NETIME$)
- CALL TRIM(NETBAUD$)
- * DELETING old line(s)
- 97
- * REPLACING old line(s) by new
- 201 SUBROUTINE.PARAMETER = -10
- CALL CARRIER
- IF SUBROUTINE.PARAMETER = 0 THEN _
- GOTO 210
- EXIT.TO.DOORS = FALSE
- PRIVATE.DOOR = FALSE
- '
- ' *****************************************************************************
- ' * RESET THE MODEM VIA THE MODEM CONTROL REGISTER TO ASSURE IT IS READY *
- ' *****************************************************************************
- '
- * ------[ first line different ]------
- STATE%=0 'FOSS
- CALL FOSDTR(COMPORT%,STATE%) 'FOSS
- ' OUT MODEM.CONTROL.REGISTER,&H4
- CALL DELAYIT (MODEM.INIT.WAIT.TIME)
- '
- ' *****************************************************************************
- ' * CLEAR THE MODEM CONTROL REGISTER PRIOR TO OPEN THE COMMUNICATIONS PORT *
- ' *****************************************************************************
- '
- STATE%=1 'FOSS
- CALL FOSDTR(COMPORT%,STATE%) 'FOSS
- ' OUT MODEM.CONTROL.REGISTER,&H0
- CALL DELAYIT (MODEM.INIT.WAIT.TIME)
- * REPLACING old line(s) by new
- 235 EIGHT.BIT = TRUE
- SUBROUTINE.PARAMETER = -10
- CALL CARRIER
- IF SUBROUTINE.PARAMETER = 0 AND _
- EXIT.TO.DOORS THEN _
- CALL READPROF : _
- SUBROUTINE.PARAMETER = 1 : _
- GOTO 335
- IF SUBROUTINE.PARAMETER = 0 AND _
- EXPECT.ACTIVE.MODEM THEN _
- * ------[ first line different ]------
- BAUD.TEST = VAL(NETBAUD$) : _ 'TRAIL
- GOTO 328
- IF EXPECT.ACTIVE.MODEM OR _
- EXIT.TO.DOORS THEN _
- SUBROUTINE.PARAMETER = 4 : _
- EXIT SUB
- IF SUBROUTINE.PARAMETER = 0 THEN _
- GOTO 324
- PCJR = FALSE
- IF COMPUTER.TYPE = 2 AND _
- COM.PORT$ = "COM1" AND _
- MODEM.STATUS.REGISTER = 1022 THEN _
- MODEM.GO.OFFHOOK.COMMAND$ = CHR$(14) + _
- "P" : _
- PCJR = TRUE
- CALL SYSMENU
- IF PCJR THEN _
- A$ = CHR$(14) + _
- "I" _
- ELSE A$ = MODEM.RESET.COMMAND$
- CALL MODEMPUT (A$)
- CALL DELAYIT (MODEM.INIT.WAIT.TIME)
- IF PCJR THEN _
- A$ = CHR$(14) + _ ' PC-JR'S MODEM COMMAND IDENTIFIER
- "C 0," + _ ' SET "AUTO-ANSWER" OFF ON PC-JR'S MODEM
- "S 1," + _ ' SET SPEED TO 300 BAUD ON PC-JR'S MODEM
- "H" _ ' MANUALLY HANG UP THE PHONE (IF NOT ALREADY)
- ELSE A$ = MODEM.INIT.COMMAND$
- CALL MODEMPUT (A$)
- IF PCJR THEN _
- A$ = CHR$(14) + _
- "F 4" : _
- CALL MODEMPUT (A$)
- RINGBACK = FALSE
- LOCATE 16,55
- IF REQUIRED.RINGS = 0 THEN _
- CALL LPRNT("WAITING FOR CARRIER",0) : _
- GOTO 237
- IF MID$(MODEM.INIT.COMMAND$, _
- INSTR(MODEM.INIT.COMMAND$,"S0") + 3,3) = "255" THEN _
- CALL LPRNT("RING BACK SYSTEM",0) : _
- RINGBACK = TRUE : _
- GOTO 236
- CALL LPRNT("WAITING FOR RING ",0)
- * REPLACING old line(s) by new
- * ------[ first line different ]------
- 276 CALL FOSREADAHEAD(COMPORT%,CHAR%) 'FOSS
- IF CHAR% <> -1 THEN _ 'FOSS
- CALL FLUSHCOM(X$) : _
- IF SUBROUTINE.PARAMETER = - 1 THEN _
- EXIT SUB
- IF PCJR THEN _
- GOTO 320
- A$ = MODEM.COUNT.RINGS.COMMAND$
- CALL MODEMPUT (A$)
- CALL DELAYIT (MODEM.COMMAND.DELAY.TIME)
- * REPLACING old line(s) by new
- 335 IF NOT RELIABLE.MODE THEN _
- * ------[ first line different ]------
- A = INSTR(TRANSFER.OPTIONS$,"G)") : _ 'AL0402
- IF A > 0 THEN _
- TRANSFER.OPTIONS$ = LEFT$(TRANSFER.OPTIONS$,A - 1) + _
- MID$(TRANSFER.OPTIONS$,A + 11) 'AL0402
- DONT.WRITE = 0
- END SUB
- ' $SUBTITLE: 'BADCHAR - subroutine to check user names for bad characters'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- BADCHAR
- '
- ' INPUT PARAMETERS -- PARAMETER MEANING
- ' PASSED.NAME$ USER NAME
- '
- ' OUTPUT PARAMETERS -- PASSED.NAME$ USER NAME WILL CONTAIN ""
- ' IF BAD CHARACTERS FOUND
- '
- ' SUBROUTINE PURPOSE -- TO CHECK USER NAMES FOR INVALID CHARACTERS
- '
- SUB BADCHAR (PASSED.NAME$) STATIC
- '
- J = 1
- XX = LEN(PASSED.NAME$)
- * REPLACING old line(s) by new
- 950 IF NOT SNOOP THEN _
- EXIT SUB
- CURSOR.LINE = CSRLIN
- CURSOR.ROW = POS(0)
- HH = LEN(ACTIVE.USER.NAME$) + _
- LEN(CI$) + _
- LEN(LINE.25$) + _
- LEN(STR$(USER.SECURITY.LEVEL)) + _
- 18
- IF AUTODOWNLOAD.AVAILABLE THEN _
- HH = HH + 4
- LOCATE 25,1
- IF NETWORK.TYPE = 0 THEN _
- IF AUTODOWNLOAD.AVAILABLE THEN _
- LOCK.STATUS$ = SPACE$(3) + _
- "AD " + _
- TIME.LOGGED.ON$ _
- * ------[ first line different ]------
- ELSE LOCK.STATUS$ = SPACE$(3) + _
- TIME.LOGGED.ON$
- IF HH > 79 THEN _
- HH = 78
- LINE.25.HOLD$ = LINE.25$ + _
- SPACE$(79 - HH) + _
- STR$(USER.SECURITY.LEVEL) + _
- " " + _
- ACTIVE.USER.NAME$ + _
- " " + _
- CI$ + _
- " " + _
- LOCK.STATUS$
- CALL LPRNT(LINE.25.HOLD$,0)
- LOCATE CURSOR.LINE,CURSOR.ROW
- END SUB
- ' $SUBTITLE: 'SRCHCMND - subroutine to search command list'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- SRCHCMND
- '
- ' INPUT PARAMETERS -- PARAMETER MEANING
- ' STRT.POS POSITION TO BEGIN SEARCH AT
- ' ALL.OPTS$ STRING TO SEARCH (COMMAND LIST)
- ' Z$ WHAT TO LOOK FOR
- '
- ' OUTPUT PARAMETERS -- WHERE.FOUND POSITION OF Z$ IN ALL.OPTS$
- ' 0 IF NOT FOUND
- '
- ' SUBROUTINE PURPOSE -- SEARCHES VALID COMMAND LIST FOR THE REQUESTED
- ' COMMAND. IF THE SYSOP HAS CONFIGURED RBBS-PC TO
- ' RESTRICT COMMANDS TO ONLY THOSE VALID WITHIN THE
- ' RBBS-PC SUBSYSTEM, THEN ONLY THOSE COMMANDS AND
- ' "GLOBAL" COMMANDS ARE VALID. OTHERWISE ALL COMMANDS
- ' ARE VALID FROM ANY OF THE RBBS-PC SUBSYSTEMS.
- '
- SUB SRCHCMND (STRT.POS,WHERE.FOUND) STATIC
- * REPLACING old line(s) by new
- 1411 Y$ = KEY.PRESSED$
- SUBROUTINE.PARAMETER = PARM
- IF LOCAL.USER THEN _
- GOTO 1430
- * ------[ first line different ]------
- CALL FOSREADAHEAD(COMPORT%,CHAR%) 'FOSS
- IF CHAR% = -1 THEN _ 'FOSS
- CALL CARRIER : _
- IF SUBROUTINE.PARAMETER = -1 THEN _
- EXIT SUB _
- ELSE GOTO 1430
- CALL GETCOM(Y$)
- * REPLACING old line(s) by new
- 1525 CALL CARRIER
- IF SUBROUTINE.PARAMETER = -1 THEN _
- EXIT SUB
- IF LEN(COMMPORT.STACK$) > 0 THEN _
- Y$ = LEFT$(COMMPORT.STACK$,1) : _
- COMMPORT.STACK$ = RIGHT$(COMMPORT.STACK$,LEN(COMMPORT.STACK$)-1) : _
- GOTO 1541 _
- ELSE IF LOCAL.USER THEN _
- CALL FINDFUNC: _
- IF SUBROUTINE.PARAMETER < 0 THEN _
- EXIT SUB_
- ELSE GOTO 1526 _
- * ------[ first line different ]------
- ELSE _ 'FOSS
- CALL FOSREADAHEAD(COMPORT%,CHAR%) : _ 'FOSS
- IF CHAR% <> -1 THEN _ 'FOSS
- CALL GETCOM(Y$) : _
- IF SUBROUTINE.PARAMETER = -1 THEN _
- EXIT SUB _
- ELSE GOTO 1541
- CALL FINDTIME (TI!)
- IF TI! > AUTO.WARN! THEN _
- IF TI! > AUTO.LOGOFF! THEN _
- CALL UPDTCALR ("Sleep disconnect",1) : _
- SUBROUTINE.PARAMETER = -1 : _
- EXIT SUB _
- ELSE IF SLEEP.WARN THEN _
- SLEEP.WARN = FALSE : _
- SUBROUTINE.PARAMETER = 2 : _
- A$ = CHR$(7) + _
- "LOGGING you OFF if you do not respond in 30 seconds!" + _
- CHR$(7) : _
- CALL TPUT
- CALL FINDFUNC
- IF SUBROUTINE.PARAMETER < 0 THEN _
- EXIT SUB
- * REPLACING old line(s) by new
- * ------[ first line different ]------
- 1545 IF INSTR(LINEEDIT.CHK$,Y$) > 4 _ 'AL0402
- GOTO 1635
- IF Y$ < " " AND Y$ <> CARRIAGE.RETURN$ THEN _
- GOTO 1525
- IF Y$ = "^" THEN _
- GOTO 1525
- IF Y$ = CARRIAGE.RETURN$ THEN _
- IF NO.ADVANCE THEN _
- NO.ADVANCE = FALSE : _
- GOTO 1575 _
- ELSE CALL LPRNT (CARRIAGE.RETURN$ + LINE.FEED$,0) : _
- GOSUB 1551 : _
- GOTO 1570 _
- ELSE GOSUB 1550
- IF LEN(B$) => 254 THEN _
- A$ = "Input too long!" : _
- SUBROUTINE.PARAMETER = 5 : _
- CALL TPUT : _
- IF SUBROUTINE.PARAMETER = -1 OR FUNCTION.KEY <> 0 THEN _
- EXIT SUB _
- ELSE GOTO 1500
- B$ = B$ + _
- Y$
- GOTO 1525
- * REPLACING old line(s) by new
- 1654 IF NOT KEEP.INIT.BAUD THEN _
- TALK.TO.MODEM.AT$ = MID$(" 300 450 1200 2400 4800 960019200",(-5 * BPS),5) _
- ELSE TALK.TO.MODEM.AT$ = MODEM.INIT.BAUD$
- CALL TRIM (TALK.TO.MODEM.AT$)
- IF LEN(TALK.TO.MODEM.AT$) < 5 THEN _
- TALK.TO.MODEM.AT$ = SPACE$(4 - LEN(TALK.TO.MODEM.AT$)) + _
- TALK.TO.MODEM.AT$
- IF KEEP.INIT.BAUD THEN _
- EXIT SUB
- IF BPS = -1 THEN _
- * ------[ first line different ]------
- COMSPEED%=300 : _
- CALL FOSSPEED(COMPORT%,COMSPEED%) : EXIT SUB
- IF BPS = -2 THEN _
- COMSPEED%=450 : _
- CALL FOSSPEED(COMPORT%,COMSPEED%) : EXIT SUB
- IF BPS = -3 THEN _
- COMSPEED%=1200 : _
- CALL FOSSPEED(COMPORT%,COMSPEED%) : EXIT SUB
- IF BPS = -4 THEN _
- COMSPEED%=2400 : _
- CALL FOSSPEED(COMPORT%,COMSPEED%) : EXIT SUB
- IF BPS = -5 THEN _
- COMSPEED%=4800 : _
- CALL FOSSPEED(COMPORT%,COMSPEED%) : EXIT SUB
- IF BPS = -6 THEN _
- COMSPEED%=9600 : _
- CALL FOSSPEED(COMPORT%,COMSPEED%) : EXIT SUB
- IF BPS = -7 THEN _
- COMSPEED%=19200 : _
- CALL FOSSPEED(COMPORT%,COMSPEED%) : EXIT SUB
- END SUB
- ' $SUBTITLE: 'LINEEDIT - subroutine to produce edited line'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- LINEEDIT
- '
- ' INPUT PARAMETERS -- PARAMETER MEANING
- ' BACK.ARROW$
- ' BACKSPACE$
- ' CARRIAGE.RETURN$
- ' LINE.FEED$
- ' LINEMES$ BUFFER SPACE TO USE FOR HOLDING LINE
- ' LOCAL.USER
- ' MAX.LEN MAXIMUM LENGTH OF STRING TO INPUT
- ' MESSAGE.LINE WHERE IN A$() TO PUT THE EDITED LINE
- ' RIGHT.MARGIN
- ' SNOOP
- ' STOP.INTERRUPTS
- ' WAIT.EXPIRED
- '
- ' OUTPUT PARAMETERS -- A$(MESSAGE.LINE) EDITED LINE
- '
- ' SUBROUTINE PURPOSE -- SUBROUTINE TO EDIT A LINE QUICKLY USING A MINIMUM OF
- ' STRING SPACE.
- '
- SUB LINEEDIT (MESSAGE.LINE,MAX.LEN) STATIC
- * REPLACING old line(s) by new
- * ------[ first line different ]------
- 3732 CALL FOSREADAHEAD(COMPORT%,CHAR%) 'FOSS
- IF CHAR% <> -1 THEN _ 'FOSS
- GOTO 3736
- CALL FINDTIME (TI!)
- IF TI! > AUTO.LOGOFF! THEN _
- WAIT.EXPIRED = TRUE : _
- EXIT SUB
- * REPLACING old line(s) by new
- 3750 IF SEND.REMOTE THEN _
- CALL PUTCOM(X$)
- CALL LPRNT (X$, 0)
- * ------[ first line different ]------
- IF X$ <> CARRIAGE.RETURN$ THEN _ 'AL0402
- GOTO 3770 'AL0402
- IF (CSRLIN < 24) AND (NOT USE.BASIC.WRITES) THEN _ 'AL0402
- CALL PSCRN(CHR$(13) + CHR$(10)) 'AL0402
- COL = COL - 1 'AL0402
- GOTO 3850 'AL0402
- * REPLACING old line(s) by new
- 5510 CALL QTPUT ("Change your baud rate to 450",1)
- CALL DELAYIT (9)
- C = 0
- * ------[ first line different ]------
- BPS = -2 'AL0402
- CALL SETBAUD
- A$ = " and then press [ENTER] until I respond"
- SUBROUTINE.PARAMETER = 9
- CALL TGET
- * REPLACING old line(s) by new
- 5530 C = C + 1
- CALL CARRIER
- IF SUBROUTINE.PARAMETER THEN _
- EXIT SUB
- IF C = 20 THEN _
- CALL UPDTCALR ("Baud change failed",1) : _
- * ------[ first line different ]------
- BPS = -1 : _ 'AL0402
- CALL SETBAUD : _ 'AL0402
- EXIT SUB
- CALL DELAYIT (1)
- * REPLACING old line(s) by new
- * ------[ first line different ]------
- 5535 CALL FOSREADAHEAD(COMPORT%,CHAR%) 'FOSS
- IF CHAR% = -1 THEN _ 'FOSS
- GOTO 5530
- * REPLACING old line(s) by new
- 10605 LSET USER.DOWNLOADS$ = MKI$(DOWNLOADS)
- LSET USER.UPLOADS$ = MKI$(UPLOADS)
- LSET ELAPSED.TIME$ = MKI$(Q!)
- IF ADJUSTED.SECURITY THEN _
- LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL)
- PUT 5,USER.FILE.INDEX
- * ------[ first line different ]------
- SUBROUTINE.PARAMETER = 8
- CALL FILELOCK
- * REPLACING old line(s) by new
- * ------[ first line different ]------
- 10994 EXIT.TO.DOORS = TRUE
- ' OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1 'FOSS
- IF NOT PRIVATE.DOOR THEN _
- CALL MLINIT (2)
- * REPLACING old line(s) by new
- 10996 IF NOT SYSOP THEN _
- CALL UPDATEU : _
- SUBROUTINE.PARAMETER = 8 : _
- CALL FILELOCK
- CALL GETIME
- CALL UPDATEC
- CALL SAVEPROF (1)
- IF NUM.LINES = 0 THEN _
- EXIT SUB
- * ------[ first line different ]------
- ' CALL DELAYIT (9 + BPS) 'AL0330
- CALL FOSEXIT(COMPORT%) 'FOSS
- SYSTEM
- END SUB
- ' $SUBTITLE: 'UNTILRIGHT - subroutine to ask question until answer okay'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- UNTILRIGHT
- '
- ' INPUT PARAMETERS -- PARAMETER MEANING
- ' QUES$ QUESTION TO BE ASKED THE USER
- ' ANS$ LOCATION TO STORE THE ANSWER
- ' MIN.LEN MINIMUM LENGTH OF ANSWER
- ' MAX.LEN MAX LENGTH OF ANSWER
- '
- ' OUTPUT PARAMETERS -- ANS$ RESPONSE TO THE QUESTION WHICH THE
- ' CALLERS SAYS IS CORRECT
- '
- ' SUBROUTINE PURPOSE -- SUBROUTINE TO ASK A USER A QUESTION UNTIL THE CALLER
- ' RESPONDS THAT THE ANSWER IS CORRECT
- '
- SUB UNTILRIGHT (QUES$,ANS$,MIN.LEN,MAX.LEN) STATIC
- * REPLACING old line(s) by new
- 20288 IF L < LEN(PATTERN$) AND MID$(PATTERN$,L + 1,1) <> "*" THEN _
- OK = FALSE
- END SUB
- ' $SUBTITLE: 'SENDNAME - send FILENAME using EXEC-PC protocol'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- SENDNAME
- '
- ' INPUT PARAMETERS -- PARAMETER MEANING
- ' B$() ARRAY OF FILENAME FOR AUTODOWNLOAD
- ' DWN.INDEX INDEX OF FILENAME TO TRANSFER
- '
- ' OUTPUT PARAMETERS -- ABORT -1 FOR AN ABORTED ATTEMPT
- '
- ' SUBROUTINE PURPOSE -- SEND THE DOWNLOAD FILENAME TO USER DURING AN
- ' AUTODOWNLOAD.
- '
- SUB SENDNAME STATIC
- '
- ' *****************************************************************************
- ' * TRANSFER FILENAME TO USER *
- ' * PROCESS - SEND USER THE "ALERT" CHARACTER SEQUENCE -- <ESC>OD *
- ' * THEN THIS IS FOLLOWED BY CHARACTER-BY-CHARACTER *
- ' * TRANSMISSION OF THE FILENAME WITH ECHO. IF ANY OF THE *
- ' * CHARACTERS OF THE FILENMAE ARE GARBLED A SERIES OF *
- ' * <CAN> ARE SENT, OTHERWISE AN <ACK> IS SENT AT *
- ' * COMPLETION AND FILE TRANSFER BEGINS. *
- ' *****************************************************************************
- '
- * ------[ first line different ]------
- ' ABORT = FALSE ' RESET ABORT FLAG
- ' ATTEMPTS = 0 ' RESET COUNT FOR # OF TRANS ATTEMPTS
- '20295 CALL DELAYIT (1) ' ONE SECOND DELAY
- '20296 CALL FLUSHCOM(Y$) ' CLEAR THE COMM BUFFER OF GARBAGE
- ' IF SUBROUTINE.PARAMETER = -1 THEN _
- ' EXIT SUB
- ' CALL PUTCOM (ESCAPE$+"OD") ' SEND "ALERT" STRING CPC161AI
- ' IF SUBROUTINE.PARAMETER = -1 THEN _
- ' EXIT SUB
- ' IF ABORT = TRUE THEN _
- ' GOTO 20306
- ' CALL LPRNT("Sending FILENAME -- ",1)
- ' CALL LPRNT(RETURN.LINE.FEED$ + CHR$(9),0)
- ' CALL DELAYIT (1) ' WAIT 1 SECOND FOR SETUP
- ''
- '' SEND ONE CHARACTER AT A TIME
- ''
- ' A$ = B$(DWN.INDEX) + _
- ' "=X"
- ' FOR X = 1 TO LEN(A$)
- ' CALL PUTCOM (MID$(A$,X,1)) ' SEND 1 CHARACTER
- ' IF SUBROUTINE.PARAMETER = -1 THEN _
- ' EXIT SUB
- ' IF ABORT = TRUE THEN _
- ' GOTO 20306
- ' CALL LPRNT(MID$(A$,X,1),0) ' DISPLAY IF NEEDED
- ' IF TIMER < 86390! THEN _
- ' DELAY! = TIMER + 10 _
- ' ELSE DELAY! = TIMER - 86400! + 10 ' SET MAXIMUM TIME TO WAIT FOR REPLY
- ' WHILE EOF(3)
- ' IF TIMER > DELAY! THEN _
- ' GOTO 20300 ' IF NO ECHO, CANCEL FILENAME TRANSFER
- ' WEND ' JUMP OUT IF CHARACTER IS RECEIVED
- '20298 CALL FLUSHCOM(Y$) ' COLLECT CHARACTER(S) USER ECHOED
- ' IF SUBROUTINE.PARAMETER = -1 THEN _
- ' EXIT SUB
- ' IF MID$(A$,X,1) = Y$ THEN _
- ' GOTO 20305 ' IF CORRECTLY ECHOED, THEN CONTINUE
- ' IF INSTR(Y$,CANCEL$) THEN _
- ' ABORT = TRUE : _
- ' GOTO 20306 ' CHECK FOR USER ABORT
- '20300 CALL PUTCOM (STRING$(5,24)) ' TELL USER THAT FILE NAME IS GARBLED
- ' IF SUBROUTINE.PARAMETER = - 1 THEN _
- ' EXIT SUB
- ' IF ABORT = TRUE THEN _
- ' GOTO 20306
- ' CALL LPRNT("Name Trans Failure",1) ' DISPLAY FAILURE ON SCREEN
- ' ATTEMPTS = ATTEMPTS + 1 ' INCREMENT COUNTER FOR # OF TRIES
- ' IF ATTEMPTS < 6 THEN _ ' TRY IT FIVE TIMES, THEN GIVE UP
- ' GOTO 20295
- ' CALL PUTCOM (STRING$(50,24)) ' GUARANTEE CANCELLATION OF USER
- ' IF SUBROUTINE.PARAMETER = -1 THEN _
- ' EXIT SUB
- ' IF ABORT = TRUE THEN _
- ' GOTO 20306
- ' IF SNOOP THEN _
- ' CALL LPRNT("ABORTING AUTODOWNLOAD!",1) : _
- ABORT = TRUE : _
- GOTO 20306
- '
- '20305 NEXT ' LOOP BACK FOR NEXT CHARACTER
- '
- ' CALL PUTCOM (ACKNOWLEDGE$) ' WHEN FILENAME SENT, ACKNOWLEDGE
- ' IF SUBROUITNE.PARAMETER = -1 THEN _
- ' EXIT SUB
- ' CALL SKIPLINE(1) ' CLEAN UP SYSOP'S DISPLAY
- '
- ' COMPLETION OF AUTODOWNLOAD FILENAME TRANSFER
- '
- * DELETING old line(s)
- 20295
- 20296
- 20298
- 20300
- 20305
- * REPLACING old line(s) by new
- 20306 END SUB
- ' $SUBTITLE: 'TESTUSER - interrogate user for AUTO-DOWNLOADING protocol'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- TESTUSER
- '
- ' INPUT PARAMETERS -- NONE
- '
- ' OUTPUT PARAMETERS -- AUTODOWNLOAD.AVAILABLE -1 IF USER'S COMMUNICATION
- ' SOFTWARE CAN DO AUTO-
- ' DOWNLOADING
- '
- ' AUTODOWNLOAD.VERIFIED TRUE IF COMMUNICATIONS PGM
- ' EVER CHECKED
- '
- ' SUBROUTINE PURPOSE -- SEND THE USER AN <ESCAPE><XON> AND IF RESPONSE
- ' IS A RECOGNIZED PACKAGE, SET APPROPRIATE FLAG.
- '
- SUB TESTUSER STATIC
- '
- ' *****************************************************************************
- ' * TEST FOR COMMUNICATIONS USING N,8,1 PROTOCOL AND EXECPC TALK VER 2.0+ *
- ' * TO SEE IF CALLER CAN USE THE AUTODOWNLOAD FEATURE *
- ' *****************************************************************************
- '
- * ------[ first line different ]------
- '20310 ABORT = FALSE
- AUTODOWNLOAD.VERIFIED = TRUE
- ' CALL FLUSHCOM(Y$) ' FLUSH THE COMM BUFFER
- ' IF SUBROUTINE.PARAMETER = -1 THEN _
- ' EXIT SUB
- ' CALL PUTCOM (ESCAPE$ + XON$)
- ' IF ABORT = TRUE THEN _
- ' GOTO 20315
- ' CALL DELAYIT (2) ' WAIT TWO SECONDS FOR REPLY
- '20313 CALL FLUSHCOM(Y$) ' GET CONTENTS OF COMM BUFFER
- ' IF SUBROUTINE.PARAMETER = -1 THEN _
- ' EXIT SUB
- ' IF INSTR(Y$,"EXECPC") THEN _
- ' COM.PROGRAM = 1
- ' IF INSTR(Y$,"PIBTERM") THEN _
- ' COM.PROGRAM = 2
- ' IF INSTR(Y$,"PROCOMM") THEN _
- ' COM.PROGRAM = 3
- ' IF INSTR(Y$,"QMODEM") THEN _
- ' COM.PROGRAM = 4
- ' AUTODOWNLOAD.AVAILABLE = (COM.PROGRAM > 0 AND COM.PROGRAM < 3)
- * DELETING old line(s)
- 20310
- 20313
- * REPLACING old line(s) by new
- 20725 EN$ = UPLOAD.DIRECTORY$
- IF FMS.DIRECTORY$ = UPLOAD.DIRECTORY$ OR LIMIT.SEARCH.TO.FMS THEN _
- B$ = DESC$ + _
- SPACE$(MAX.DESC.LEN - LEN(DESC$)) + _
- Y$ + _
- SPACE$(3 - LEN(Y$))
- GOSUB 20730
- * ------[ first line different ]------
- EN$ = "$" + RIGHT$(DATE$,2) + LEFT$(DATE$,2) + ".UPL" 'AL0402
- GOSUB 20730 'AL0402
- * REPLACING old line(s) by new
- 20730 ' ---[ lock file ]---
- IF EN$ = "" THEN _
- RETURN
- BX = &H4
- SUBROUTINE.PARAMETER = 9
- CALL FILELOCK
- CLOSE 2
- IF SHARE.IT THEN _
- OPEN EN$ FOR APPEND SHARED AS #2 _
- ELSE OPEN "A",2,EN$
- ' ---[ append ]---
- * ------[ first line different ]------
- IF RIGHT$(EN$,4) = ".UPL" THEN _ 'AL0402
- PRINT #2,USING "\ \######## & & &"; _ 'AL0402
- FILE.NAME.HOLD$; BYTES.IN.FILE#; Z$; B$; _ 'AL0402
- ACTIVE.USER.NAME$ _ 'AL0402
- ELSE PRINT #2,USING "\ \######## & &"; _ 'AL0402
- FILE.NAME.HOLD$; BYTES.IN.FILE#; Z$; B$ 'AL0402
- CLOSE 2
- ' ---[ unlock ]---
- BX = &H4
- SUBROUTINE.PARAMETER = 10
- CALL FILELOCK
- RETURN
- END SUB
- ' $SUBTITLE: 'BADFILE - subroutine to find bad file names'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- BADFILE
- '
- ' INPUT PARAMETERS -- PARAMETER MEANING
- ' VIOLATION$
- ' VIOLATIONS.THIS.SESSION
- ' FILNAME$ NAME OF FILE
- '
- ' OUTPUT PARAMETERS -- RESULT 1 = FILE NAME IS OK
- ' 2 = CHARACTER NOT ALLOWED
- ' 3 = SYSTEM CRASH ATTEMPT
- ' VIOLATIONS.THIS.SESSION NUMBER OF VIOLATIONS
- ' FILNAME$ Gets capitalized
- '
- ' SUBROUTINE PURPOSE -- TO PROTECT RBBS-PC AGAINST THE USE OF BAD FILE NAMES
- ' TO EITHER CRASH THE SYSTEM OR TO BREACH RBBS-PC'S
- ' SECURITY
- '
- SUB BADFILE (FILNAME$,RESULT) STATIC
- '
- ' *****************************************************************************
- ' * TEST FOR INVALID CHARACTERS IN FILENAME *
- ' *****************************************************************************
- '
- * REPLACING old line(s) by new
- 20742 VIOLATIONS.THIS.SESSION = MAXIMUM.VIOLATIONS
- VIOLATION$ = VIOLATION$ + _
- FILNAME$
- RESULT = 3
- END SUB
- ' $SUBTITLE: 'LIBRARY - subroutine to support Library downloads'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- LIBRARY
- '
- ' INPUT PARAMETERS -- PARAMETER MEANING
- ' SUBROUTINE.PARAMETER 1 = DISPLAY ACTIVE AREA
- ' 2 = CHANGE ACTIVE AREA
- ' 3 = DISPLAY PC-SIG
- ' DISCLAIMER
- ' 4 = ARCHIVE LIBRARY DISK
- ' 5 = DOWNLOAD COMPLETED
- ' LIBRARY.TYPE 0 = NO LIBRARY ACTIVE
- ' 1 = LIBRARY FROM PC-SIG
- ' LIBRARY.DRIVE$ LIBRARY DRIVE ID
- '
- ' OUTPUT PARAMETERS -- NONE
- '
- ' SUBROUTINE PURPOSE -- TO PROVIDE ACCESSS SUPPORT FOR LIBRARY DRIVES
- '
- SUB LIBRARY STATIC
- * ------[ first line different ]------
- END SUB
- ' $SUBTITLE: 'XFERTYPE - subroutine to identify file xfer protocol'
- ' $PAGE
- '
- ' SUBROUTINE NAME -- XFERTYPE
- '
- ' INPUT PARAMETERS -- PARAMETER MEANING
- ' A$
- ' B$(1)
- ' Q
- ' RELIABLE.MODE
- ' TRANSFER.OPTIONS$
- ' USER.TRANSFER.DEFAULT$
- ' KERMIT.SUPPORT 'AL0331
- ' DSZ.SUPPORT 'AL0331
- ' CLINK.SUPPORT 'AL0331
- '
- ' OUTPUT PARAMETERS -- CHECKSUM
- ' FLEN
- ' FT$
- '
- ' SUBROUTINE PURPOSE -- TO IDENTIFY THE FILE TRANSFER PROTOCOL (EITHER
- ' FROM THE USER'S DEFAULT OR VIA EXPLICIT SELECTION)
- '
- SUB XFERTYPE(INDEX,SKIP.HELP) STATIC
- ON INDEX GOTO 21600,21620
- '
- ' *****************************************************************************
- ' * MANUAL SELECT OF TRANSFER PROTOCOL *
- ' *****************************************************************************
- '
- * DELETING old line(s)
- 21105
- 21110
- 21115
- 21117
- 21120
- 21121
- 21122
- 21126
- 21130
- 21140
- 21145
- 21150
- 21151
- 21152
- 21153
- 21155
- 21156
- 21157
- 21158
- 21159
- * REPLACING old line(s) by new
- 21610 CALL ALLCAPS (Z$)
- IF INSTR("H?",Z$) > 0 THEN _
- GOTO 21602
- FF = INSTR(DFLTXFER$,Z$)
- * ------[ first line different ]------
- BLOCK.SIZE = 1 'AL0331
- IF Z$ = "N" THEN _
- FF = 10 'AL0402
- IF FF < 1 THEN _
- GOTO 21600
- IF FF < 4 THEN _
- GOTO 21612
- IF FF = 4 AND NOT KERMIT.SUPPORT THEN _ 'AL0331
- GOTO 21600 'AL0331
- IF FF > 4 AND FF < 9 THEN _ 'AL0402
- BLOCK.SIZE = 8 : _ 'AL0331
- IF FF = 5 THEN _ 'AL0331
- GOTO 21612 'AL0331
- IF (FF > 4 AND FF < 9) AND NOT DSZ.SUPPORT THEN _ 'AL0402
- GOTO 21600 'AL0331
- IF FF = 7 AND NOT RELIABLE.MODE THEN _ 'AL0402
- GOTO 21600 'AL0402
- IF FF = 9 AND NOT CLINK.SUPPORT THEN _ 'AL0402
- GOTO 21600 'AL0331
- * REPLACING old line(s) by new
- 21612 FT$ = MID$(DFLTXFER$,FF,1)
- CHECKSUM = (FF = 2)
- * ------[ first line different ]------
- FLEN = 128 - 896 * (BLOCK.SIZE = 8) 'AL0331
- GOTO 21621